package com.lingjtx.common.redis.topic;

import com.alibaba.fastjson2.JSONObject;
import com.lingjtx.common.core.util.StringUtil;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component;

/**
 * 发布消息
 * redis 发布订阅用于简单的消息广播
 */
@Component
public class RedisPublisher {

    private final RedissonClient redissonClient;

    public RedisPublisher(RedissonClient redissonClient) {
        this.redissonClient = redissonClient;
    }

    /**
     * 在发布消息的时候严格按照规范书写，必须以 channel:开头，channel:用户ID:业务:业务ID:意图。
     * 比如 channel:user_id:order:order_id:create（新增一条订单消息）
     *
     * @param channel channel:业务:意图
     * @param message json 数据
     */
    public String publishMessage(String channel, Object message) {
        // 获取一个发布/订阅的主题（Topic）
        RTopic topic = redissonClient.getTopic(channel);

        String uid = StringUtil.getUuid();
        JSONObject object = new JSONObject();
        object.put("messageId", uid);
        object.put("data", message);

        // 发布消息
        topic.publish(object);
        return uid;
    }
}
